home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 076-100 / 093 / dme / text1.c < prev    next >
C/C++ Source or Header  |  1995-03-13  |  14KB  |  847 lines

  1.  
  2. /*
  3.  * TEXT1.C
  4.  *
  5.  *    (C)Copyright 1987 by Matthew Dillon,    All Rights Reserved
  6.  */
  7.  
  8. #include "defs.h"
  9.  
  10. #define TU        titleupdate = 1
  11. #define nomemory()  {memoryfail = 1; TU;}
  12.  
  13. text_init()
  14. {
  15.     register ED *e;
  16.     long dirlock;
  17.  
  18.     text_switch(NULL);
  19.     dirlock = E.dirlock;
  20.     e = (ED *)MAllocate(sizeof(ED));
  21.     if (e == NULL)
  22.     return(0);
  23.     bzero(&E, sizeof(E));
  24.     E.Win = Win;
  25.     if (Ep) {
  26.     E.Insertmode = Ep->Insertmode;
  27.     E.Tabstop    = Ep->Tabstop;
  28.     E.Wordwrap   = Ep->Wordwrap;
  29.     } else {
  30.     E.Insertmode = 1;
  31.     E.Tabstop = 4;
  32.     }
  33.     E.Lines = 1;
  34.     E.Maxlines = 32;
  35.     E.List = (u_char **)MAllocate(sizeof(char *) * E.Maxlines);
  36.     E.List[0] = MAllocate(1);
  37.     E.List[0][0] = Current[0] = Clen = 0;
  38.     E.BSline = E.BEline = -1;
  39.     E.IWiny = 16;
  40.     E.dirlock = dirlock;    /* workbench support    */
  41.     *e = E;
  42.     llink(&Base, e);
  43.     strcpy(E.Name, "ram:unnamed");
  44.     Ep = e;
  45.     text_cursor(1);
  46.     return(1);
  47. }
  48.  
  49.  
  50. text_switch(win)
  51. WIN *win;
  52. {
  53.     register ED *e;
  54.     register ED *next, **prev;
  55.  
  56.     if (Ep) {
  57.     text_sync();
  58.     E.next = Ep->next;
  59.     E.prev = Ep->prev;
  60.     strcpy(E.Wtitle, Ep->Wtitle);
  61.     *Ep = E;
  62.     }
  63.     if (win) {
  64.     for (e = Base; e; e = e->next) {
  65.         if (e->Win == win) {
  66.         Ep = e;
  67.         Win = win;
  68.         Rp = Win->RPort;
  69.         E = *e;
  70.         text_load();
  71.         return(1);
  72.         }
  73.     }
  74.     return(0);
  75.     }
  76. }
  77.  
  78.  
  79. text_sync()
  80. {
  81.     char redraw = 0;
  82.     short len;
  83.     u_char *ptr;
  84.  
  85.     for (len = strlen(Current) - 1; len >= 0 && Current[len] == ' '; --len)
  86.     Current[len] = '\0';
  87.     Clen = len + 1;
  88.     if (!ComLineMode) {
  89.     if (strlen(E.List[E.Line]) != Clen) {
  90.         if (ptr = MAllocate(Clen+1)) {
  91.         E.Modified = 1;
  92.         FreeMem(E.List[E.Line], strlen(E.List[E.Line])+1);
  93.         E.List[E.Line] = ptr;
  94.         } else {
  95.         nomemory();
  96.         strcpy(Current, E.List[E.Line]);
  97.         Clen = strlen(Current);
  98.         }
  99.     } else {
  100.         if (strcmp(E.List[E.Line], Current))
  101.         E.Modified = 1;
  102.     }
  103.     strcpy(E.List[E.Line], Current);
  104.     }
  105.     if (Nsu == 0) {
  106.     if (E.Column - E.Topcolumn >= Columns || E.Column < E.Topcolumn) {
  107.         redraw = 1;
  108.         E.Topcolumn = E.Column - (Columns>>1);
  109.         if (E.Topcolumn < 0)
  110.         E.Topcolumn = 0;
  111.     }
  112.     if (E.Line - E.Topline >= Rows || E.Line < E.Topline) {
  113.         redraw = 1;
  114.         E.Topline = E.Line - (Rows>>1);
  115.         if (E.Topline < 0)
  116.         E.Topline = 0;
  117.     }
  118.     }
  119.     while (E.Column > Clen)
  120.     Current[Clen++] = ' ';
  121.     Current[Clen] = '\0';
  122.     if (redraw)
  123.     text_redisplay();
  124.     return((int)redraw);
  125. }
  126.  
  127. text_load()
  128. {
  129.     if (ComLineMode)
  130.     return(0);
  131.     strcpy(Current, E.List[E.Line]);
  132.     Clen = strlen(Current);
  133.     while (E.Column > Clen)
  134.     Current[Clen++] = ' ';
  135.     Current[Clen] = '\0';
  136. }
  137.  
  138. text_titleupdate()
  139. {
  140.     int r = titleupdate;
  141.  
  142.     titleupdate = 0;
  143.     return(r);
  144. }
  145.  
  146. text_lineno()
  147. {
  148.     return(E.Line + 1);
  149. }
  150.  
  151. text_lines()
  152. {
  153.     return(E.Lines);
  154. }
  155.  
  156. text_colno()
  157. {
  158.     return(E.Column);
  159. }
  160.  
  161. text_cols()
  162. {
  163.     return((int)Clen);
  164. }
  165.  
  166. text_imode()
  167. {
  168.     return(E.Insertmode);
  169. }
  170.  
  171. text_tabsize()
  172. {
  173.     return((int)E.Tabstop);
  174. }
  175.  
  176. u_char *
  177. text_name()
  178. {
  179.     return(E.Name);
  180. }
  181.  
  182.  
  183. text_uninit()
  184. {
  185.     register int i;
  186.     register ED *e;
  187.  
  188.     for (i = 0; i < E.Lines; ++i)
  189.     FreeMem(E.List[i], strlen(E.List[i])+1);
  190.     FreeMem(E.List, E.Maxlines * sizeof(char *));
  191.  
  192.     lunlink(Ep);
  193.     FreeMem(Ep, sizeof(ED));
  194.     if (Base) {
  195.     E = *Base;
  196.     Ep= Base;
  197.     text_load();
  198.     } else {
  199.     Ep = NULL;
  200.     }
  201. }
  202.  
  203. inversemode(n)
  204. {
  205.     if (n) {
  206.     SetAPen(Rp, 3);
  207.     SetDrMd(Rp, JAM2|INVERSVID);
  208.     } else {
  209.     SetAPen(Rp, 1);
  210.     SetDrMd(Rp, JAM2);
  211.     }
  212. }
  213.  
  214. text_cursor(n)
  215. {
  216.     movetocursor();
  217.     inversemode(n);
  218.     if (Current[E.Column])
  219.     Text(Rp, Current+E.Column, 1);
  220.     else
  221.     Text(Rp, " ", 1);
  222.     inversemode(0);
  223. }
  224.  
  225.  
  226. text_position(col, row)
  227. {
  228.     TU;
  229.     text_sync();
  230.     if (col == 0)
  231.     col = -1;
  232.     E.Column = E.Topcolumn + col;
  233.     if (E.Column > 254)
  234.     E.Column = 254;
  235.     if (E.Column < 0)
  236.     E.Column = 0;
  237.     E.Line = E.Topline + row;
  238.     if (E.Line >= E.Lines)
  239.     E.Line = E.Lines - 1;
  240.     if (E.Line < 0)
  241.     E.Line = 0;
  242.     text_load();
  243.     text_sync();
  244. }
  245.  
  246.  
  247. text_displayseg(start, n)
  248. {
  249.     register short i, c;
  250.     register u_char *ptr;
  251.     char ib;
  252.  
  253.     if (Nsu)
  254.     return(0);
  255.     for (i = start; i < start+n && E.Topline + i < E.Lines; ++i) {
  256.     if (ComLineMode) {
  257.         if (E.Topline + i != E.Line)
  258.         continue;
  259.         ptr = Current;
  260.     } else {
  261.         ptr = E.List[E.Topline + i];
  262.     }
  263.     for (c = E.Topcolumn; c && *ptr; ++ptr, --c);
  264.     c = strlen(ptr);
  265.     if (c) {
  266.         Move(Rp, COLT(0), ROWT(i));
  267.         Text(Rp, ptr, (c > Columns) ? Columns : c);
  268.     }
  269.     }
  270. }
  271.  
  272. text_redisplay()
  273. {
  274.     if (Nsu)
  275.     return(0);
  276.     SetAPen(Rp, 0);
  277.     if (ComLineMode)
  278.     RectFill(Rp, COL(0), ROW(Rows-1), Xbase+Xpixs, Ybase+Ypixs);
  279.     else
  280.     RectFill(Rp, Xbase, Ybase, Xbase + Xpixs, Ybase + Ypixs);
  281.     SetAPen(Rp, 1);
  282.     text_displayseg(0,Rows);
  283. }
  284.  
  285. text_redisplaycurrline()
  286. {
  287.     int row = E.Line - E.Topline;
  288.  
  289.     if (Nsu)
  290.     return(0);
  291.     SetAPen(Rp, 0);
  292.     RectFill(Rp, COL(0), ROW(row), Xbase+Xpixs, ROW(row+1)-1);
  293.     SetAPen(Rp, 1);
  294.     text_displayseg(row, 1);
  295. }
  296.  
  297. text_write(str)
  298. u_char *str;
  299. {
  300.     short len = strlen(str);
  301.     short i;
  302.  
  303.     if (Clen + len >= 255) {
  304.     text_sync();
  305.     text_load();
  306.     }
  307.     if (E.Insertmode == 0) {
  308.     i = len;
  309.     if (E.Column + len < 255) {
  310.         bmov(str, Current + E.Column, len);
  311.         if (E.Column + len >= Clen)
  312.         Clen = E.Column + len;
  313.         Current[Clen] = 0;
  314.         goto bin;
  315.     }
  316.     goto ok;
  317.     }
  318.     if (Clen + len < 255) {
  319.     bmov(Current + E.Column, Current + E.Column + len, Clen+1-E.Column);
  320.     bmov(str, Current + E.Column, len);
  321.     Clen += len;
  322.     ScrollRaster(Rp, -len * Xsize, 0 ,
  323.         COL(E.Column - E.Topcolumn), ROW(E.Line - E.Topline),
  324.         COL(Columns) - 1, ROW(E.Line - E.Topline + 1) - 1
  325.     );
  326.     i = (E.Column - E.Topcolumn + len > Columns) ? Columns - E.Column + E.Topcolumn : len;
  327. bin:
  328.     Move(Rp, COLT(E.Column - E.Topcolumn), ROWT(E.Line - E.Topline));
  329.     Text(Rp, str, i);
  330.     E.Column += len;
  331.     if (E.Column - E.Topcolumn >= Columns)
  332.         text_sync();
  333.     }
  334. ok:
  335.     if (ComLineMode == 0 && E.Wordwrap)
  336.     do_reformat(0);
  337. }
  338.  
  339.  
  340. do_up()
  341. {
  342.     if (E.Line) {
  343.     TU;
  344.     text_sync();
  345.     --E.Line;
  346.     text_load();
  347.     if (E.Line < E.Topline) {
  348.         if (Nsu == 0) {
  349.         ScrollRaster(Rp,0,-Ysize,COL(0),ROW(0),COL(Columns)-1,ROW(Rows)-1);
  350.         --E.Topline;
  351.         text_displayseg(0, 1);
  352.         }
  353.     }
  354.     } else {
  355.     Abortcommand = 1;
  356.     }
  357. }
  358.  
  359. do_down()
  360. {
  361.     if (E.Line + 1 < E.Lines) {
  362.     TU;
  363.     text_sync();
  364.     ++E.Line;
  365.     text_load();
  366.     if (E.Line - E.Topline >= Rows) {
  367.         if (Nsu == 0) {
  368.         ScrollRaster(Rp,0,Ysize,COL(0),ROW(0),COL(Columns)-1,ROW(Rows)-1);
  369.         ++E.Topline;
  370.         text_displayseg(Rows-1, 1);
  371.         }
  372.     }
  373.     } else {
  374.     Abortcommand = 1;
  375.     }
  376. }
  377.  
  378. /*
  379.  *  PAGEUP
  380.  *  PAGEDOWN
  381.  *  PAGESET n    (n = 0 to 100 for percentage of #rows to scroll, minimum 1)
  382.  *        can be > 100.
  383.  */
  384.  
  385. do_page()
  386. {
  387.     register int n, multiplier = 1;
  388.     static short pctg = 80;
  389.  
  390.     switch(av[0][4]) {
  391.     case 'u':
  392.     multiplier = -1;
  393.     case 'd':
  394.     n = multiplier * Rows * pctg / 100;
  395.     if (!n)
  396.         n = multiplier;
  397.     if (n > 0 && E.Topline >= E.Lines - Rows)
  398.         return(0);
  399.     text_sync();
  400.     TU;
  401.     E.Line += n;
  402.     E.Topline += n;
  403.     if (E.Line >= E.Lines)
  404.         E.Line = E.Lines - 1;
  405.     if (E.Line < 0)
  406.         E.Line = 0;
  407.     if (E.Topline >= E.Lines)
  408.         E.Topline = E.Lines - Rows - 1;
  409.     if (E.Topline < 0)
  410.         E.Topline = 0;
  411.     text_load();
  412.     if (!text_sync())
  413.         text_redisplay();
  414.     break;
  415.     case 's':
  416.     pctg = atoi(av[1]);
  417.     break;
  418.     }
  419. }
  420.  
  421.  
  422. do_downadd()
  423. {
  424.     u_char *ptr;
  425.  
  426.     if (E.Line + 1 == E.Lines) {
  427.     E.Modified = 1;
  428.     if (makeroom(32) && (ptr = MAllocate(1))) {
  429.         E.List[E.Lines] = ptr;
  430.         *ptr = 0;
  431.         ++E.Lines;
  432.     } else {
  433.         nomemory();
  434.     }
  435.     }
  436.     do_down();
  437. }
  438.  
  439.  
  440. do_left()
  441. {
  442.     if (E.Column) {
  443.     --E.Column;
  444.     if (E.Column < E.Topcolumn)
  445.         text_sync();
  446.     } else {
  447.     Abortcommand = 1;
  448.     }
  449. }
  450.  
  451. do_right()
  452. {
  453.     if (E.Column != 254) {
  454.     if (Current[E.Column] == 0) {
  455.         Current[E.Column] = ' ';
  456.         Current[E.Column+1]= '\0';
  457.         ++Clen;
  458.     }
  459.     ++E.Column;
  460.     if (E.Column - E.Topcolumn >= Columns)
  461.         text_sync();
  462.     } else {
  463.     Abortcommand = 1;
  464.     }
  465. }
  466.  
  467. do_tab()
  468. {
  469.     register short n;
  470.  
  471.     for (n = E.Tabstop-(E.Column % E.Tabstop); n > 0; --n)
  472.     do_right();
  473. }
  474.  
  475. do_backtab()
  476. {
  477.     register short n;
  478.  
  479.     n = E.Column % E.Tabstop;
  480.     if (!n)
  481.     n = E.Tabstop;
  482.     for (; n > 0; --n)
  483.     do_left();
  484. }
  485.  
  486. do_return()
  487. {
  488.     u_char buf[256];
  489.  
  490.     if (ComLineMode) {
  491.     strcpy(buf, Current);
  492.     escapecomlinemode();
  493.     do_command(buf);
  494.     } else {
  495.     E.Column = 0;
  496.     text_sync();
  497.     do_downadd();
  498.     }
  499. }
  500.  
  501. do_bs()
  502. {
  503.     if (E.Column) {
  504.     bmov(Current + E.Column, Current + E.Column - 1, Clen - E.Column + 1);
  505.     --E.Column;
  506.     --Clen;
  507.     if (E.Column < E.Topcolumn) {
  508.         text_sync();
  509.     } else {
  510.         ScrollRaster(Rp, Xsize, 0,
  511.         COL(E.Column - E.Topcolumn),
  512.         ROW(E.Line   - E.Topline),
  513.         COL(Columns)-1,
  514.         ROW(E.Line - E.Topline + 1)-1
  515.         );
  516.         if (Clen >= E.Topcolumn + Columns) {
  517.         Move(Rp, COLT(Columns-1), ROWT(E.Line - E.Topline));
  518.         Text(Rp, Current + E.Topcolumn + Columns - 1, 1);
  519.         }
  520.     }
  521.     if (ComLineMode == 0 && E.Wordwrap)
  522.         do_reformat(0);
  523.     } else {
  524.     Abortcommand = 1;
  525.     }
  526. }
  527.  
  528.  
  529. /*
  530.  * esc, escimm
  531.  */
  532.  
  533. int Savetopline, Savecolumn, Savetopcolumn;
  534.  
  535. do_esc()
  536. {
  537.     if (ComLineMode)
  538.     return(escapecomlinemode());
  539.     text_sync();
  540.     if (av[0][3] == 'i')
  541.     strcpy(Current, av[1]);
  542.     else
  543.     Current[0] = 0;
  544.     Clen = strlen(Current);
  545.     ComLineMode = 1;
  546.     returnoveride(1);
  547.     Savetopline = E.Topline;
  548.     Savecolumn    = E.Column;
  549.     Savetopcolumn = E.Topcolumn;
  550.     E.Column    = Clen;
  551.     E.Topcolumn = 0;
  552.     E.Topline    = E.Line - Rows + 1;
  553.     SetAPen(Rp, 0);
  554.     RectFill(Rp, COL(0), ROW(Rows-1), Xbase+Xpixs, Ybase+Ypixs);
  555.     SetAPen(Rp, 1);
  556.     Move(Rp, COL(0), ROW(Rows-1) - 1);
  557.     Draw(Rp, Xbase + Xpixs, ROW(Rows-1) - 1);
  558.     text_displayseg(Rows-1,1);
  559. }
  560.  
  561.  
  562. escapecomlinemode()
  563. {
  564.     if (ComLineMode) {
  565.     ComLineMode = 0;
  566.     returnoveride(0);
  567.     E.Topline = Savetopline;
  568.     E.Column  = Savecolumn;
  569.     E.Topcolumn = Savetopcolumn;
  570.     text_load();
  571.     SetAPen(Rp, 0);
  572.     RectFill(Rp, COL(0), ROW(Rows-1)-1, Xbase+Xpixs, Ybase+Ypixs);
  573.     SetAPen(Rp, 1);
  574.     text_displayseg(Rows-2,2);
  575.     }
  576. }
  577.  
  578.  
  579. do_del()
  580. {
  581.     if (Current[E.Column]) {
  582.     bmov(Current + E.Column + 1, Current + E.Column, Clen - E.Column);
  583.     --Clen;
  584.     ScrollRaster(Rp, Xsize, 0,
  585.         COL(E.Column - E.Topcolumn),
  586.         ROW(E.Line - E.Topline),
  587.         COL(Columns)-1,
  588.         ROW(E.Line - E.Topline + 1) - 1
  589.     );
  590.     if (Clen >= E.Topcolumn + Columns) {
  591.         Move(Rp, COLT(Columns-1), ROWT(E.Line-E.Topline));
  592.         Text(Rp, Current+E.Topcolumn+Columns-1, 1);
  593.     }
  594.     if (ComLineMode == 0 && E.Wordwrap)
  595.         do_reformat(0);
  596.     }
  597. }
  598.  
  599. do_top()
  600. {
  601.     text_sync();
  602.     E.Line = 0;
  603.     TU;
  604.     text_load();
  605.     text_sync();
  606. }
  607.  
  608. do_bottom()
  609. {
  610.     text_sync();
  611.     E.Line = E.Lines - 1;
  612.     TU;
  613.     text_load();
  614.     text_sync();
  615. }
  616.  
  617. do_firstcolumn()
  618. {
  619.     if (E.Column) {
  620.     E.Column = 0;
  621.     text_sync();
  622.     }
  623. }
  624.  
  625. do_firstnb()
  626. {
  627.     for (E.Column = 0; Current[E.Column] == ' '; ++E.Column);
  628.     if (Current[E.Column] == 0)
  629.     E.Column = 0;
  630.     text_sync();
  631. }
  632.  
  633. do_lastcolumn()
  634. {
  635.     short i;
  636.  
  637.     text_sync();
  638.     i = (ComLineMode) ? Clen : strlen(E.List[E.Line]);
  639.     if (i != E.Column) {
  640.     E.Column = i;
  641.     text_sync();
  642.     }
  643. }
  644.  
  645. /*
  646.  * GOTO [+/-]N
  647.  * GOTO BLOCK    start of block
  648.  * GOTO START    start of block
  649.  * GOTO END    end of block
  650.  */
  651.  
  652. do_goto()
  653. {
  654.     register short n, i;
  655.     register u_char *ptr = av[1];
  656.  
  657.     i = 0;
  658.     n = -1;
  659.  
  660.     switch(*ptr) {
  661.     case 'b':
  662.     case 's':
  663.     case 'B':
  664.     case 'S':
  665.     n = E.BSline;
  666.     break;
  667.     case 'e':
  668.     case 'E':
  669.     n = E.BEline;
  670.     break;
  671.     case '+':
  672.     i = 1;
  673.     case '-':
  674.     n = E.Line;
  675.     default:
  676.     n += atoi(ptr+i);
  677.     }
  678.     if (n >= E.Lines)
  679.     n = E.Lines - 1;
  680.     if (n < 0)
  681.     n = 0;
  682.     text_sync();
  683.     E.Line = n;
  684.     TU;
  685.     text_load();
  686.     text_sync();
  687. }
  688.  
  689. do_screentop()
  690. {
  691.     text_sync();
  692.     TU;
  693.     E.Line = E.Topline;
  694.     text_load();
  695.     text_sync();
  696. }
  697.  
  698. do_screenbottom()
  699. {
  700.     text_sync();
  701.     TU;
  702.     E.Line = E.Topline + Rows - 1;
  703.     if (E.Line < 0 || E.Line >= E.Lines)
  704.     E.Line = E.Lines - 1;
  705.     text_load();
  706.     text_sync();
  707. }
  708.  
  709. static u_char Fstr[256];
  710. static u_char Rstr[256];
  711. static short Srch_sign;
  712. static char Doreplace;
  713.  
  714. /*
  715.  * findstr, repstr
  716.  */
  717.  
  718. do_findstr()
  719. {
  720.     if (av[0][0] == 'f')
  721.     strcpy(Fstr, av[1]);
  722.     else
  723.     strcpy(Rstr, av[1]);
  724. }
  725.  
  726. /*
  727.  * findr, nextr, prevr
  728.  */
  729.  
  730. do_findr()
  731. {
  732.     Doreplace = 1;
  733.     Srch_sign = 1;
  734.     switch(av[0][0]) {
  735.     case 'f':
  736.     strcpy(Fstr, av[1]);
  737.     strcpy(Rstr, av[2]);
  738.     break;
  739.     case 'p':
  740.     Srch_sign = -1;
  741.     break;
  742.     }
  743.     search_operation();
  744. }
  745.  
  746. /*
  747.  * find, next, prev
  748.  */
  749.  
  750. do_find()
  751. {
  752.     Doreplace = 0;
  753.     Srch_sign = 1;
  754.     switch(av[0][0]) {
  755.     case 'f':
  756.     strcpy(Fstr, av[1]);
  757.     break;
  758.     case 'p':
  759.     Srch_sign = -1;
  760.     break;
  761.     }
  762.     search_operation();
  763. }
  764.  
  765.  
  766. void
  767. search_operation()
  768. {
  769.     int flen = strlen(Fstr);
  770.     int rlen = strlen(Rstr);
  771.     char senabled = 0;
  772.     register u_char *ptr;
  773.     register int i, col;
  774.  
  775.     TU;
  776.     text_sync();
  777.     if (!flen) {
  778.     title("No find pattern");
  779.     Abortcommand = 1;
  780.     return;
  781.     }
  782.  
  783.     col = E.Column;
  784.     if (col >= strlen(E.List[E.Line]))
  785.     col = strlen(E.List[E.Line]);
  786.     for (i = E.Line;;) {
  787.     ptr = E.List[i];
  788.     if (Srch_sign > 0) {
  789.         while (ptr[col]) {
  790.         if (Fstr[0] == ptr[col] &&
  791.         strncmp(Fstr,ptr+col,flen) == 0 &&
  792.         senabled) {
  793.             goto found;
  794.         }
  795.         senabled = 1;
  796.         ++col;
  797.         }
  798.         senabled = 1;
  799.         if (++i >= E.Lines)
  800.         break;
  801.         col = 0;
  802.     } else {
  803.         while (col >= 0) {
  804.         if (Fstr[0] == ptr[col] &&
  805.         strncmp(Fstr,ptr+col,flen) == 0 &&
  806.         senabled) {
  807.             goto found;
  808.         }
  809.         senabled = 1;
  810.         --col;
  811.         }
  812.         senabled = 1;
  813.         if (--i < 0)
  814.         break;
  815.         col = strlen(E.List[i]);
  816.     }
  817.     }
  818.     MShowTitle = 1;
  819.     title("Pattern Not Found");
  820.     Abortcommand = 1;
  821.     return;
  822.  
  823. found:
  824.     E.Line = i;
  825.     E.Column = col;
  826.  
  827.     text_load();
  828.     if (Doreplace) {
  829.     if (rlen > flen && rlen-flen+strlen(ptr) > 254) {
  830.         title("Replace: Line Too Long");
  831.         Abortcommand = 1;
  832.         return;
  833.     }
  834.     if (Clen-col-flen >= 0) {
  835.         bmov(Current+col+flen, Current+col+rlen, Clen-col-flen+1);
  836.         bmov(Rstr, Current+col, rlen);
  837.         Clen += rlen-flen;
  838.     }
  839.     text_sync();
  840.     text_redisplaycurrline();
  841.     } else {
  842.     text_sync();
  843.     }
  844. }
  845.  
  846.  
  847.